서비스의 가치를 생각하는 개발자, 도소현
사용자에게 오늘보다 나은 내일을 제공하자는 아래 백엔드 개발자를 꿈꾸고 있습니다.
활동에 대한 증빙자료는 링크를 통해 확인할 있습니다.
Blog : https://velog.io/@devlyny
Contact : 010-6732-2315
E-mail : lyny.doh@gmail.com
Education
전공 관련 수료 과목
이화여자대학교
GPA (3.78/4.3
호크마교양대학 (2020.03 - 2021.03
컴퓨터공학졸업예정(2021.03 - 2024.02)
EPITA(School of Engineering and Computer Science
Summer Program AI Course (2022.07)
컴퓨터 프로그래밍 실습
객체지향 프로그래밍 실
오토마타 형식언
사이버보안개
소프트웨어창의융합설계
2020 - 2
1학2학
2020 - 2
1학2학
2021 - 1
2학1학
컴퓨터구
임베디드 시스템 실
시스템 SW 실
JAVA 프로그래밍 실습
2021 - 2
2학2학
데이터베이
정보통신공
운영체제
기계학
블록체인응
자료구
컴퓨터네트워크
2022 - 1
3학1학
2022 -
3학2학
인공지
파일러
2023 - 1
4학1학
클라우
드컴퓨
데이터응
2023 - 2
4학2학
Projects
MILE
모임을 위한 글쓰기 공간, 마일
GitHu
https://github.com/Mile-Writings
https://www.milewriting.com
Stac
Java 17, SpringBoot 3.2.1 JPA, MySQL, Redis AWS Console, Docker, QuertDsl, Github Actions, Swagger,
역
리드 서버 개발
Docker 컨테이너 기반 배포 환경 구
Openfeign을 이용한 소셜 로그인, Security + JWT + Redis 기반
인증/인가 프로세스 구
Spring Boot 기반 API 작
Nginx를 이용해 리버스 프록시 구
멀티 모듈 프로젝트를 통해 모듈간 의존성 분
MDCUtil & Discord 연동을 통한 에러 요청/응답 객체 로
Redisson 라이브러리의 setnx 활용을 통해 중복 체크 관련 API 분산
구현
Projects
MILE
서버 아키텍처
https://www.milewriting.com
authentication
config
filter
domain
도메인별 분리
repository
service
exception
config
filter
Projects
프로젝트 구조
MILE
https://www.milewriting.com
module-api
module-auth
modul
common
modul
domain
modul
external
controller
메인 모듈
인증/인가 소셜 로그인 구현 모듈
SecurityConfig 클래스 정의
JwtAuthenticationFilter 정의
Authentication 객체 인가 handler 정의
OpenFeign을 이용한
외부 API 호출 Jwt 클래스 정의
기본 configuration 파일 예외 처리, 로깅, Util 클래스 서비스 공통 모듈
D
ata
b
ase의
T
a
b
le을 정의한
엔티티
클래스,
DB
연동
R
epository 서비스
모듈
A
W
S S
3
외부 서비스
연동
모듈
L
og
관련
패키지
U
RL
코딩
R
esolver
래스
날짜
변환
등의 Util 클래스 정의
공용
DT
O 클래스 정의
로깅을
Servlet Filter
MD
CFilter 정의
CO
R
S
방지를
W
e
b
Config, Filter
FilterConfig Configuration 파일
예외 처리 클래스 정의
Projects
구현 상세
MILE
https://www.milewriting.com
멀티 모듈 프로젝트를 통해 모듈간 의존성 분리
구현 상세
delete 쿼리 개선
프로젝트의 리팩토링 과정에서 삭제의 경우 글에 해당하
좋아요(궁금해요)와 댓글 삭제 쿼리가 delete ? where id = ? 형식으
무한대까지 나가는 상황인 것을 발견했습니다.
JPQL을 이용하여 delete from 쿼리를 이용해 벌크 연산을 실행했습니다.
멀티 모듈 도입 배경 도입 배경
도입 방법
도입 결과
멀티 모듈 도입 방식
도입 결과
패키지간 의존성을 줄이는 방법에 대해 고민하던 중, MiLE에서는 패키지가 가지는 역할을 모듈화
하여 관리하고자 했습니다.
팀원
멀티 모듈 방식에 대해
설명
함께
구조도
그렸
습니다.
코드
정이
모듈의
트가
100%
습니다.
초기
mod
u
l
dom
a
in
mod
u
le
-au
th
mod
u
l
common
mod
u
l
e
x
tern
a
l
mod
u
le
-a
pi
리팩토링
이
무한대의
3
개의 delete
으로
감소
Projects
MILE
https://www.milewriting.com
구현 상세
MDCFilter를 이용한 Discord 로깅
Logback을 사용해 Discord에 로깅을 하고 있던 상황에서 여러 번의
청이 동시에 들어올 멀티 스레드 환경에서 로그가 섞여 요청에 대한
석이 어려웠습니다.
도입 배경
도입 방식
도입 결과
기존 Discord 로깅 형태 도입 Discord 로깅 형태
여러개의 요청에 대한 에러가 발생해도 MDC 별로 정돈된 형태로 Discord Webhook을 통해 로깅됩니다.
문제점
로깅의 시작점과 끝점이 섞여서 로그가
요청에 해당하는 것인지 없었습
니다.
MDCFilter를 통해
HTTP
요청
부터
요한
져와
JSON
식으
환하
MDC에
저장
,
HTTP
요청과
관련
컨텍
로그에
있도
들었습니다.
요청 별로
저장
MDC에 대하여 Discord
A
ppender를 통해 Discord Webhook
U
ri로 정돈된 형태로 로깅을
진행
습니다.
Projects
MILE
https://www.milewriting.com
구현 상세
구현 동기
구현 방법
테스트
글모임 이름 중복 체크 관련 분산락 적용
베타 테스트 유치를 앞두고 PM과 함께 테스트 대상 유저를 200명으로 예상했습니다. FGI(Focus Group Interview) 결과, 글모임 이름 중복
체크 과정에 대한 데이터 정합성 처리가 필요하다는 점을 확인했습니다.
 글모임 생성 글모임 이름 중복체크에 활용되는 메서드에 적용할 어노테이션(@AtomicValidateUniqueMoimName)을 생성
 트랜잭션 커밋 해제 시점을 보장하기 위해 Propagation.REQUIRES_NEW옵션을 지정해 부모 트랜잭션의 유무에 관계없이 별도의
트랜잭션으로 동작하게끔 설정
Around 어노테이션을
@AtomicValidateUniqueMoimName이 적용되어
메서드에 대해 Redisson setn
x
용하
분산
락을
획득
하고 해제하는
작성
E
x
ecutorService를 활용하
1
00
동시
초반
1개
나머
청은
중복체크에
걸려
4
00
B
ad Request의
드를
하는
가정, Moc
k
Mvc로 작성
Projects
MILE
https://www.milewriting.com
구현 상세
구현 동기
구현 방식
관련 Pull Request
전략 패턴을 사용한 소셜 로그인 구현
여러 개의 서비스를 제공하여 로그인 안정성을 제공하고자 새로운 서비스를 추가하였습니다. 새로운 엔드포인트를 추가하는 방향일 경우 소셜 로그인
비스가 추가될 경우 확장성이 다소 낮다고 고려했습니다.
 런타임 알고리즘을 바꾸는 전략패턴을 적
 로그인 전략의 틀을 Interface로 분리하여 이를 구현한 전략 클래스(Kakao, Google)를 구현, 전략 클래스에 구분을 위해 SocialType
Getter와 함께 정
 등록된 클래스를 런타임에 따라 매칭해주는매니저를 구현하여 매니저 클래스에 다음과 같이 Map으로 의존성을 받고 생성자를 통해 의존성을
주입받고, 전략 클래스마다 정의되어 있는 Social Type을 키로 보
 실제 런타임에서는 switch, case 문으로 아래와 같이 LoginStrategy를 대응
Projects
ASAP
최적의 회의시간 도출 서비스
IT 창업동아SOPT APPJAM 우수상 수상
GitHu
https://github.com/ASAP-as-soon-as-possible
역
Github Actions, AWS Code Deploy CD 파이프라인 구
@Sl4fj와 Logback을 활용한 Request Body 로
Spring Boot 기반 API 작
개발 서버 배포 서버 분
Nginx를 이용해 리버스 프록시 구
Slack API 통해 서버 장애 모니터링
Stac
Java 17, SpringBoot 3.2.1 JPA, MySQL, AWS Console, Github Actions, Swagger
https://www.beginwithasap.com
관련 링크 : https://velog.io/@devlyny/Spring-AOP
Projects
ASAP
서버 아키텍처
https://www.beginwithasap.com
Projects
ASAP
폴더 구조
https://www.beginwithasap.com
main
test
java
resources
Logback.xml 로깅 관련 파
환경 변수 파일
어플리케이션 로직 테스
Mockito기반 Controller 테스트
common
enums
model
vo
dto
advice
filter
jwt
resolver swagger
aspect filter utils
config
controller
domain
exception
repository
service
필터 등록을 위한 configuratio
JWT 토큰 생
토큰 path variable 복호화 resolv
스웨터 문서 정리
예외처리 ControllerAdivc
로깅 AOP 클래스 정
Request 재사용을 위한 FIlte
로직 계산을 위한 Util Component
Projects
ASAP
https://www.beginwithasap.com
상세
Spring AOP , Logback 사용하여 Request 로깅
Request Body에 유효하지 않은 값을 확인해주기 위해 @Validation 어노테이션을 사용했지만 유효성 검사에 사각지대가 존재하였습니다. Request Body가 값으로 전해져
서버 내부 오류가 발생하였고 서버 인스턴스 내부에 들어가 nohup.out 파일 내부를 확인하는 불편함이 있었습니다. 로그의 경우 팀원과 함께 일관된 정보를 확인해야한다는 보장
있어야 했기 때문에 파일을 생성하여 날짜별로 기록하는 방식을 사용했습니다.
LoggingAspect 클래
Controller 메소드가 작동될 로깅이 적용되기 위해 PointCut 정
Request에 대한 Response 또한 기록해야하므로 Around(메소드 호출 후에 수행) 적용
단순히
Spring 내부에서 로깅
경우,
영역
에서
요청
들어오
오류가
요청
로그를
기지
한다
HTT
P에
접근
하기
ContentCachingRequest
W
rapper를
상속받아
Logging
F
ilter을 만들어 Request Body
러번
참조
(
읽음
)
필터
정의
H
ttpRequestCon
f
ig를
핉터
등
logback
-
spring.
x
ml을
로깅
정, 서버가
에서
동될 경우 console에 기록, de
v
에서
동될 경우 파일에 기록하는 방식으로
x
ml 파일 정의
로깅
도입
배경
로깅
방식
문제
Projects
ASAP
https://www.beginwithasap.com
상세
Slack API 연동하여 서버 내부 오류 모니터링
서버 내부 오류가 발생했을 때, 세부 사항을 즉각적으로 확인할 없는 문제점을 발견하
고, 내부 오류를 빠르게 모니터링 하는 방법으로 협업 툴인 Slack을 연동했습니다.
ControllerAdvice를 통해 체크 예외인 Exception이 발생하는 경우, request와 예외
내용을 담아 에러가 발생한 시점에 알림을 보낸다
전체 메시지가 담겨 있는 LayoutBlock을 생성하고 이를 바탕으로 Slack에 전송하는
Message 생성
모니터링 도입 배경
방식
단순 클라이언트의 요청에 대한 에러 뿐만 아니라, 악의적인 해커의 반복적 요청에 대해
서도 대응할 있었음
효과
JWT 토큰을 이용한 방장 인증
의의 방장으로
여한
한을 확인하
간편
방법을
JWT
반의 인증
사용했습니다
U
ser 도메인의
식별값
user
_
id 이용해 JWT
JWT
형식
으로
들어온
헤더
에서
R
esolver를 이용해 JWT
호화
토큰
기반
인증
방식 도입 배경
방식
유저
인증
JWT 토큰으로
일원화된
으로 방장 인증
료되
않은
토큰이
존재함(유저
쿠키
에는
존재
하지
)
에도
불구
토큰을
리소스
발생하는
발견, 이를
해서
R
edis를
효과
목표
Projects
최적의 회의시간을 GET 하는 과정에서 Heap Space Out Of Memory 에러 발생
기존 ERD와 로직
해결 방법 해결 ERD
회의에 참여하는 참여자와 참여자의 가능시간을 담는 테이블을 두고
HashMap형식으로 <시, 가능한 사용자 List>를 찾아 가장 리스트가 간을 찾는
로직으로 구현했습니다. 때, 회의를 주체한 회의 방장이 제출했던 소요 간을 고려하
상황이었습니다. 로직과 더해 30분 단위로 간을 잘라 구현했으므로 최대 252개
HashMap이 발생하는 상황이었습니다.
엔드포인트는 유지하되 내부 DB 구조를 효율적으로 바꾸고자 했습니다. HashMap 객체를 가장 최소로
용하는 방향을 고안하던 DB 관계에서 가능한 간과 가능한 사용자를 저장하는 방법을 고안했습니다
방장이 입력한 회의 날짜와 회의 진행 범위에 해당하는 테이블을 만들고 각각 테이블에 참여가능한 회의
참여자 테이블의 연관관계를 구성하여 HashMap 등의 객체를 사용하지 않는 방법으로 해결했습니다.
최적의 회의시간을 GET 하는 과정에서 Heap Space Out Of Memory 에러 발생
으로 회의 참여자
아지
발생
다고
단하
로직을
변경
했습니다.
ASA
P
https
://www
.
b
e
g
i
nw
ithasap.com
문제
상황
Projects
구현 상세
구현 동기
구현 방식
시나리오 테스트
구현 회의 링크 :
Interceptor, Redisson 사용한 동시 요청에 따른 예외 처리
회의 생성 참여자들의 가능 시간 입력에서 동시에 발생한 요청으로 중복된 자원 생성되는 상을 발견했습니다
새로운 자원이 생기는 로직에 대해 대규모 WAS와 분리되어 동시에 요청을 막아야할 필요성을 느꼈습니다.
 Interceptor의 preHandle 메서드에서 회의 생성, 가능 시간 입력 API
대해 Redisson Map을 사용하여 request가 IP와 Request Body값을
저장
 putIfAbsent를 이용하여 이미 값이 존재한다면 429 Too Many Request
예외를 던
 afterCompletion 메서드를 활용하여 예외 발생 응답 제공 Map에서
해당 값을 지움
구현 회의를
진행
백엔
그래밍
형식
으로
진행
.
setn
x
사용한
방식
고민
했지
, 시간이
요청을
진행
하는
예외를
하기
때문
Redis가 제공하는 Map을 사용
ASA
P
h
ttps:
//www
.be
g
in
w
it
h
asap.com
Ex
ecutorSer
v
ice를 이용하여
쓰레
드를
러개
생성한 Moc
k
M
v
c로 동시 요청
1개
요청을 제외한
나머
요청이 429
TooManyRequest를 응답하는지
검증
하는
으로
테스트
진행
Github : https://github.com/sohyundoh
Contact : 010-6732-2315
E-mail : lyny.doh@gmail.com
개발자가 서비스의 가치에 부여할 있는 점을 생각하는 백엔드 개발자 도소현입니다
공유하는 문화 아래서 즐거움을 느끼며 성장합니다
사이드 이펙트를 줄이며 유지보수에 좋은 코드를 작성하게 위해 공부하고 있습니다
함께 성장하는 문화를 좋아합니다.
END.